package com.sailfish.springbootdemo.service.db1;

import com.sailfish.springbootdemo.pojo.Result;
import com.sailfish.springbootdemo.pojo.db1.PcbaDevice;
import com.sailfish.springbootdemo.pojo.db1.PcbaLine;

import java.util.Date;
import java.util.List;

public interface CoreAlgorithmService {

    /**
     * 计算线体的基础能力
     */
    Result calcLineBaseCapacity(Integer pcbaLineId);

    /**
     * 计算 CM 厂的量产能力值
     */
    Result calcRoadmapCmParamValue1(Integer pcbaCompanyId, String roadmapParamKey);

    /**
     * 计算 CM 厂的 能力是否匹配
     * valueAlgorithmType: 取值算法类型
     * 1：取最大值
     * 2：取最小值
     * 3：若有一个值为“是”，则为“是”
     * 4：若有一个值为“支持”，则为“支持”
     * 5：取最小值，前两位判断，如：（01005<0201<0402<0603）
     * 6：取最大值，前两位判断，如：（0603>0402>0201>01005）
     * 7：所有值组合
     * 8：绝对值最小值
     * 9：取最大值(特殊)，如（手工装配<工装辅助<人机协同<机械手臂）
     * 10：取最小值(特殊)，如（Class 100<Class 1000<Class 10000<Class 100000<Class 300000）
     * 11：若有一个值为“满足”，则为“满足”
     * 12：若有一个值为“所有器件”，则为“所有器件”
     * <p>
     * ruleAlgorithmType:规则算法类型
     * 1：CM量产能力大于等于H3C量产能力的为“是”，否则为“否”
     * 2：等于
     * 3：空值不匹配，其余匹配
     * 4：小于等于
     */
    Result calcRoadmapCmIsMatchH3c(Integer valueAlgorithmType, Integer ruleAlgorithmType, String h3cValue, String cmValue);

    /**
     * 判断设备 在高端线体中是否 超年限
     *
     * @param pcbaDevice
     * @param lineLevel
     * @return
     */
    Result calcIsOverSixYearInHighLine(PcbaDevice pcbaDevice, Integer lineLevel);

    /**
     * 判断设备年限在线体 是否达到预警
     *
     * @param pcbaDevice
     * @return
     */
    Result calcIsAgeOverdueInLine(PcbaDevice pcbaDevice);

    /**
     * 刷新设备的保养状态
     *
     * @return
     */
    Result refreshDeviceUpkeepStatus(Integer pcbaDeviceId);

    /**
     * 刷新 设备工艺实际能力 + 其他工艺实际能力 【判断是否认证已过期】
     */
    Result refreshDeviceTechCapacityOverdueValidity();

    /**
     * 刷新 其他工艺实际能力【判断是否认证已过期】
     */
    Result refreshSpecialTechCapacityOverdueValidity();

    /**
     * 刷新 设备整线工艺实际能力【判断是否认证已过期】
     */
    Result refreshLineTechCapacityOverdueValidity();

    /**
     * 超期定时发送邮件
     */
    Result sendEmailsForOverdue();


    /**
     * 级联改变所有相关参数值【重要逻辑】
     */
    void cascadeChangeAllParams(String typeStr, Integer pcbaDeviceTypeId, Integer lineId);


    /**
     * 改变基线参数池触发 -> 校验设备的基线参数是否填写完整
     */
    void changeBaseDeviceResourceStatus(Integer pcbaDeviceTypeId);

    /**
     * 改变工艺参数池触发 -> 校验设备的工艺参数是否填写完整
     */
    void changeTechDeviceResourceStatus(Integer pcbaDeviceTypeId);

    /**
     * 改变基线参数值引发
     */
    void changeDeviceResourceBaseParamValue(Integer pcbaDeviceResourceId, Date d, String userId);

    /**
     * 改变工艺实际参数值引发
     */
    void changeDeviceTechParamActualValue();

    /**
     * 改变线体设备
     */
    void changeLineDevice(Integer pcbaLineId, Date d, String userId);

    /**
     * 改变线体整线基线能力值
     */
    void changeLineBaseCapacityValue(Integer pcbaLineId, Date d, String userId);

    /**
     * 改变线体整线工艺宣称能力值
     */
    void changeLineTechCapacityDeclareValue(Integer pcbaLineId, Date d, String userId);


    /**
     * 即时刷新pcba能力匹配
     * 1.基线参数 is_related_pcba 值发生变化   type = 1
     * 2.工艺参数 is_related_pcba 值发生变化   type = 2
     * 3.整线能力 is_related_pcba 值发生变化   type = 3
     * 4.设备备注发生变化                      type = 4
     * 5.其他情况统一刷新，比如线体审核通过
     */
    void changePcbaCapacity(Integer type, String beforeStr, String afterStr, Integer pcbaDeviceTypeId, Integer pcbaDeviceId, Integer pcbaLineId);


    /**
     * 修改线体最终状态的逻辑
     * type: 1  全部线体      2：指定线体
     */
    void updatePcbaLineFinalStatus(Integer type, List<PcbaLine> pcbaLineList);

    /**
     * 级联触发 修改线体的最终状态
     * type: 1：资源池     2：设备   3：线体
     */
    void cascadeUpdateLineFinalStatus(Integer type, Integer pcbaDeviceResourceId, Integer pcbaDeviceId, Integer pcbaLineId);

}
